home *** CD-ROM | disk | FTP | other *** search
- /*
- AddReferenceTrack.c
-
- This sample code shows how a movie can be modified to use a reference track
- as the image data for an image index in a sprite track.
-
- It prompts for a movie which should contain a single sprite track, and then
- add's a movie named "Add Me" as a reference track. The reference track
- will override the image data for a selected image index.
-
- You may use the movie created with the MakeSpriteMovie sample code. The
- QuickTime icon's image index will be replaced by the "Add Me" movie.
-
- Note that the movie with the sprite track is permanently modified, so use
- a copy if you want to retain the original.
- */
-
- #include <Fonts.h>
- #include <Movies.h>
-
- #define kImageIndexToOverride 1
-
- void main( void )
- {
- OSErr err;
- short movieResID = 0, resFref, resID = 0, resRefNum;
- StandardFileReply reply;
- SFTypeList types;
- Movie m;
- Boolean done = false;
- TimeValue time = 0, oldDuration;
- FSSpec fss;
- Movie movieB;
- long i, origTrackCount, referenceIndex, imageIndexToOverride;
- Track newTrack, spriteTrack;
- QTAtomContainer inputMap;
- QTAtom inputAtom;
- OSType inputType;
- Media spriteMedia;
-
- InitGraf( &qd.thePort );
- InitFonts();
- InitWindows();
- InitMenus();
- TEInit();
- InitDialogs( 0L );
- InitCursor();
- MaxApplZone();
-
- EnterMovies();
-
- // prompt for a movie containing a sprite track and load it
- types[0] = MovieFileType;
- StandardGetFilePreview( nil, 1, types, &reply );
- if ( !reply.sfGood ) return;
-
- err = OpenMovieFile( &reply.sfFile, &resFref, fsRdPerm );
- if ( err ) return;
-
- err = NewMovieFromFile( &m, resFref, &movieResID, (StringPtr)nil, newMovieActive, nil );
- if ( err ) return;
-
- CloseMovieFile( resFref );
-
- // add a reference track
- origTrackCount = GetMovieTrackCount( m );
- FSMakeFSSpec( reply.sfFile.vRefNum, reply.sfFile.parID, "\pAdd Me", &fss );
-
- err = OpenMovieFile( &fss, &resFref, fsRdPerm );
- if ( err ) return;
-
- err = NewMovieFromFile( &movieB, resFref, &resID, (StringPtr)nil, 0, nil );
- if ( err ) return;
-
- CloseMovieFile( resFref );
- spriteTrack = GetMovieIndTrack( m, 1 );
-
- SetMovieSelection( m, 0 ,0 );
-
- for ( i = 1; i <= GetMovieTrackCount( movieB ); i++ ) {
- Track t = GetMovieIndTrack( movieB, i );
- OSType aType;
-
- GetMediaHandlerDescription( GetTrackMedia(t), &aType, nil, nil );
- if ( aType != VideoMediaType ) {
- DisposeMovieTrack( t );
- i--;
- }
- }
-
- oldDuration = GetMovieDuration( m );
- AddMovieSelection( m, movieB );
- DisposeMovie( movieB );
-
- DeleteMovieSegment( m, oldDuration, GetMovieDuration( m ) - oldDuration );
-
- newTrack = GetMovieIndTrack( m, origTrackCount + 1 );
- AddTrackReference( spriteTrack, newTrack, kTrackModifierReference, &referenceIndex );
-
- // create and add the input map
- spriteMedia = GetTrackMedia( spriteTrack );
- GetMediaInputMap( spriteMedia, &inputMap );
- QTInsertChild( inputMap, kParentAtomIsContainer, kTrackModifierInput, referenceIndex,
- 0, 0, nil, &inputAtom );
-
- inputType = kTrackModifierTypeSpriteImage;
- QTInsertChild( inputMap, inputAtom, kTrackModifierType, 1, 0,
- sizeof(inputType), &inputType, nil );
-
- imageIndexToOverride = kImageIndexToOverride;
- QTInsertChild( inputMap, inputAtom, kSpritePropertyImageIndex, 1, 0,
- sizeof(imageIndexToOverride), &imageIndexToOverride, nil );
-
- SetMediaInputMap( spriteMedia, inputMap );
- QTDisposeAtomContainer( inputMap );
-
- // save changes to movie
- OpenMovieFile( &reply.sfFile, &resRefNum, fsRdWrPerm );
- UpdateMovieResource( m, resRefNum, movieResID, nil );
- CloseMovieFile ( resRefNum );
- }
-